<template>
  <BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose title="审核" :width="400" @ok="handleSubmit">
    <BasicForm @register="registerForm" />
  </BasicModal>
</template>

<script lang="ts" setup>
  import { ref } from 'vue';
  import { BasicModal, useModalInner } from '/@/components/Modal';
  import { BasicForm, useForm } from '/@/components/Form/index';
  import { auditFormSchema } from '../NurseuserProfile.data';
  import { saveOrUpdate, addToNursesTable, updateUserInfoAfterProfile, updateFlowId, sendSubscribeMsg } from '../NurseuserProfile.api';
  import { useMessage } from '/@/hooks/web/useMessage';
  import { defHttp } from '/@/utils/http/axios';
  import { getTemplateInfoByHospital } from '../../esign_contracts/EsignContracts.api';

  const { createMessage } = useMessage();

  // Emits声明
  const emit = defineEmits(['register', 'success']);

  // 存储当前记录信息
  const currentRecord = ref<any>({});

  // 存储flow_id
  const flowId = ref<string>('');

  //表单配置
  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
    schemas: auditFormSchema,
    showActionButtonGroup: false,
    baseColProps: { span: 24 },
    labelWidth: 100,
    labelAlign: 'right',
  });

  //表单赋值
  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
    //重置表单
    await resetFields();
    setModalProps({ confirmLoading: false });

    if (data?.record) {
      // 保存当前记录信息
      currentRecord.value = data.record;
      //表单赋值
      await setFieldsValue({
        id: data.record.id,
        status: 2, // 默认审核通过
      });
    }
  });

  //表单提交事件
  async function handleSubmit() {
    try {
      let values = await validate();
      setModalProps({ confirmLoading: true });

      //提交表单（使用编辑接口）
      await saveOrUpdate(values, true);

      // 如果审核通过（status = 2），则向nurse_nurses表插入数据
      if (values.status === 2) {
        try {
          // 数据验证 - 按照项目规范检查必填字段
          if (!currentRecord.value.name || !currentRecord.value.idnumber || !currentRecord.value.phone) {
            createMessage.error('数据不完整：姓名、身份证号、手机号为必填字段！');
            return;
          }

          // 判断job字段的值：如果passexam为0或'0'，则设为"辅助人员"，否则使用position
          let jobValue = currentRecord.value.position || '';
          if (currentRecord.value.passexam === 0 || currentRecord.value.passexam === '0') {
            jobValue = '辅助人员';
            console.log('是否通过考试为否，job字段设置为：辅助人员');
          } else {
            console.log('是否通过考试为是或未设置，job字段使用position:', jobValue);
          }

          // 根据nurse_nurses表的最新结构构造数据对象
          const nursesData = {
            // 必填字段 - 按照项目规范明确必填字段
            name: currentRecord.value.name, // 护工姓名
            idcard: currentRecord.value.idnumber, // 身份证号
            phone: currentRecord.value.phone, // 手机号码
            status: 1, // 是否有效：1-有效，0-无效

            // 可选字段 - 从nurseuser_profile表映射，其他字段可为空
            avatar: currentRecord.value.photo || '', // 头像（使用photo字段）
            job: jobValue, // 职业（根据是否通过考试动态设置）
            sex: currentRecord.value.gender || 1, // 性别：1-男，2-女，默认为男
            isExpert:
              currentRecord.value.isspecialty === '是' || currentRecord.value.isspecialty === '1' || currentRecord.value.isspecialty === 1 ? 1 : 0, // 是否专家
            fee: 0, // 费用，默认为0
            hospital: currentRecord.value.hospital || '', // 隶属机构
            hospitalname: currentRecord.value.hospitalname || '', // 医院名称
            projectid: currentRecord.value.projectid || '', // 项目组ID
            projectname: currentRecord.value.projectname || '', // 项目组名称
            isShow: 1, // 是否显示到微信，默认显示
            life: parseInt(currentRecord.value.workyears) || 0, // 服务年限（使用工作年限）
            serverNumber: 0, // 服务人数，默认为0
            area: '', // 地区，可以根据address解析或设为空
            areaName: currentRecord.value.address || '', // 地区名称（使用地址）
            rate: 0, // 评分，默认为0

            // 微信相关核心字段
            // openid是核心字段，用于与微信小程序/公众号关联
            openid: currentRecord.value.openid || '', // 微信openid - 核心字段，如果暂时没有可留空待后续绑定
            unionid: currentRecord.value.unionid || '', // 微信unionid

            // 个人简介字段 - 合并详细信息
            profile: [
              currentRecord.value.introduction || '',
              currentRecord.value.education ? `学历：${currentRecord.value.education}` : '',
              currentRecord.value.major ? `专业：${currentRecord.value.major}` : '',
              currentRecord.value.profession ? `职业：${currentRecord.value.profession}` : '',
              currentRecord.value.title ? `职称：${currentRecord.value.title}` : '',
              currentRecord.value.position ? `职位：${currentRecord.value.position}` : '',
              currentRecord.value.department ? `科室：${currentRecord.value.department}` : '',
              currentRecord.value.licensenumber ? `执业证号：${currentRecord.value.licensenumber}` : '',
              currentRecord.value.qualificationnumber ? `资格证号：${currentRecord.value.qualificationnumber}` : '',
              currentRecord.value.skills ? `技能特长：${currentRecord.value.skills}` : '',
              currentRecord.value.training ? `培训经历：${currentRecord.value.training}` : '',
              currentRecord.value.certificatetime ? `证书获取时间：${currentRecord.value.certificatetime}` : '',
              currentRecord.value.level ? `级别：${currentRecord.value.level}` : '',
              currentRecord.value.age ? `年龄：${currentRecord.value.age}` : '',
              currentRecord.value.email ? `邮箱：${currentRecord.value.email}` : '',
            ]
              .filter((item) => item.trim() !== '')
              .join('\n'),
          };

          await addToNursesTable(nursesData);

          // 在调用电子签之前，先调用后端接口更新用户信息
          try {
            const updateParams = {
              idcard: currentRecord.value.idnumber,
              openid: currentRecord.value.openid || '',
              hospital: currentRecord.value.hospital || '',
              name: currentRecord.value.name,
            };

            console.log('调用updateUserInfoAfterProfile接口，参数:', updateParams);
            await updateUserInfoAfterProfile(updateParams);
            console.log('updateUserInfoAfterProfile接口调用成功');
          } catch (updateError) {
            console.error('updateUserInfoAfterProfile接口调用失败:', updateError);
            createMessage.warning('用户信息更新失败，但不影响审核流程');
          }

          // 调用腾讯电子签接口
          try {
            // 参数验证
            if (!currentRecord.value.idnumber || !currentRecord.value.phone || !currentRecord.value.name) {
              console.error('腾讯电子签接口参数不完整:', {
                idnumber: currentRecord.value.idnumber,
                phone: currentRecord.value.phone,
                name: currentRecord.value.name,
              });
              createMessage.warning('用户信息不完整，无法创建电子签合同');
              return;
            }

            // 根据医院信息动态获取模板信息
            let templateInfo;
            try {
              console.log('开始获取模板信息，医院:', currentRecord.value.hospital);
              templateInfo = await getTemplateInfoByHospital(currentRecord.value.hospital);
              console.log('成功获取到模板信息:', templateInfo);
            } catch (templateError) {
              console.error('获取模板信息失败:', templateError);
              // 使用默认模板信息作为后备方案
              // templateInfo = {
              //     templateId: 'yDtrSUUhy78o2zUEtuMJovwngrMRRZXS',
              //     flowName: '医护端用户须知',
              //     flowDescription: '医护端用户须知'
              // };
              createMessage.warning('未找到对应医院的合同模板，使用默认模板');
            }

            const tencentParams = {
              flowName: templateInfo.flowName,
              flowDescription: templateInfo.flowDescription,
              templateId: templateInfo.templateId,
              operatorId: '12345678911',
              operatorName: '叶娜',
              operatorTel: '18077795149',
              proxyOrganizationName: '广西安好医院有限公司',
              proxyOrganizationOpenId: 'org_anfine',
              'signers[0].approverType': 'PERSON',
              'signers[0].idCardNumber': currentRecord.value.idnumber,
              'signers[0].idCardType': 'ID_CARD',
              'signers[0].mobile': currentRecord.value.phone,
              'signers[0].name': currentRecord.value.name,
              'signers[0].signOrder': 1,
            };

            // 假设你的组件数组是 esignContract.components
            const components = templateInfo.components;

            // 遍历 templateInfo.components，将 formData 字段值赋给对应的 componentValue，并封装到 tencentParams
            // 假设 formData 是当前表单数据对象
            const formData = { ...currentRecord.value }; // 你可以根据实际情况调整 formData 的来源

            if (Array.isArray(components)) {
              let formFieldIndex = 0; // 索引从1开始
              components.forEach((component) => {
                let matched = false;
                const compName = typeof component.componentName === 'string' ? component.componentName : '';

                // 规则：idnumber 必须严格匹配（不能用包含规则）
                if (compName && compName.toLowerCase().includes('idnumber')) {
                  if (Object.prototype.hasOwnProperty.call(formData, 'idnumber')) {
                    component.componentValue = formData['idnumber'];
                  }
                  matched = true;
                }

                // 遍历 formData 的每个字段，查找 componentName 是否包含字段名（仅当未命中严格匹配时）
                if (!matched) {
                  for (const field in formData) {
                    if (
                      Object.prototype.hasOwnProperty.call(formData, field) &&
                      typeof component.componentName === 'string' &&
                      component.componentName.includes(field)
                    ) {
                      component.componentValue = formData[field];
                      matched = true;
                      break; // 一个 component 只匹配一个字段
                    }
                  }
                }

                // 如果控件名称包含 sysdate，则取当前日期（yyyy年m月d日）
                if (typeof component.componentName === 'string' && component.componentName.toLowerCase().includes('sysdate')) {
                  const now = new Date();
                  const yyyy = now.getFullYear();
                  const m = now.getMonth() + 1; // 1-12
                  const d = now.getDate();
                  component.componentValue = `${yyyy}年${m}月${d}日`;
                  matched = true;
                }

                // 如果控件名称包含 enddate，则取当前日期加十年（yyyy年m月d日）
                if (typeof component.componentName === 'string' && component.componentName.toLowerCase().includes('enddate')) {
                  const end = new Date();
                  end.setFullYear(end.getFullYear() + 10);
                  const yyyy = end.getFullYear();
                  const m = end.getMonth() + 1; // 1-12
                  const d = end.getDate();
                  component.componentValue = `${yyyy}年${m}月${d}日`;
                  matched = true;
                }

                // 如果未匹配到，则默认赋值 '000'
                if (!matched || component.componentValue === undefined || component.componentValue === null || component.componentValue === '') {
                  component.componentValue = '000';
                }

                // 无论是否匹配，都写入 tencentParams
                tencentParams[`formFields[${formFieldIndex}].componentName`] = component.componentName;
                tencentParams[`formFields[${formFieldIndex}].componentValue`] = component.componentValue;
                formFieldIndex++;
              });
            }

            console.log('腾讯电子签接口调用参数455555555555:', tencentParams);

            const tencentResponse = await defHttp.post({
              url: '/tencent_esign/tencent_contract/tencentContractInfo/createFlowByTemplate',
              method: 'POST',
              headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
              },
              data: {
                ...tencentParams,
                // 可添加默认参数
              },
            });
            console.log('腾讯电子签接口返回数据:', tencentResponse);
            // 保存返回的flow_id
            if (tencentResponse) {
              //   flowId.value = tencentResponse;
              //   console.log('成功获取flow_id:', tencentResponse);

              //   // 更新当前记录中的flow_id，以便后续使用
              //   currentRecord.value.flowId = flowId.value;

              // 调用接口将flowId更新到数据库
              try {
                await updateFlowId({
                  id: currentRecord.value.id,
                  flowId: tencentResponse,
                });
                console.log('flowId已成功更新到数据库');
              } catch (updateError) {
                console.error('更新flowId到数据库失败:', updateError);
              }
            }

            createMessage.success('电子签合同创建成功！');
          } catch (tencentError: any) {
            console.error('腾讯电子签接口调用失败:', tencentError);
            console.error('错误详情:', {
              message: tencentError.message,
              response: tencentError.response?.data,
              status: tencentError.response?.status,
              config: tencentError.config,
            });
            createMessage.warning('电子签合同创建失败，但不影响审核流程');
            // 不影响主流程，仅记录错误
          }

          // 发送微信订阅消息
          try {
            console.log('开始发送微信订阅消息，openid:', currentRecord.value.openid);
            
            if (currentRecord.value.openid) {
              const wechatParams = {
                template: 'Yw0XP5EHM6RhZDvWSNc_FoEL2g4MDM3UCaGWKFjh9KU',
                appid: 'wx61487172a3182261',
                appsecret: 'cacf2643b5f2238ad3ba9c61c172795d',
                openid: currentRecord.value.openid,
                page: 'pages/index/index',
                phone: currentRecord.value.phone,
              };
              
              console.log('微信订阅消息参数:', wechatParams);
              
              await sendSubscribeMsg(wechatParams);
              
              console.log('微信订阅消息发送成功');
              createMessage.success('审核通过，已成功添加到护工表，并已发送微信通知！');
            } else {
              console.warn('openid为空，跳过发送微信订阅消息');
              createMessage.success('审核通过，已成功添加到护工表！');
            }
          } catch (wechatError) {
            console.error('发送微信订阅消息失败:', wechatError);
            createMessage.success('审核通过，已成功添加到护工表！（微信通知发送失败）');
            // 不影响主流程，仅记录错误
          }
        } catch (error) {
          console.error('添加到护工表失败:', error);
          createMessage.warning('审核已通过，但添加到护工表失败，请手动处理！');
        }
      } else {
        createMessage.success('审核操作已完成！');
      }

      //关闭弹窗
      closeModal();
      //刷新列表
      emit('success');
    } finally {
      setModalProps({ confirmLoading: false });
    }
  }

  /**
   * 根据flow_id查询合同文件
   * @param flowId 合同ID
   */
  async function queryContractFile(flowId: string) {
    try {
      console.log('开始查询合同文件，flow_id:', flowId);

      const response = await defHttp.get({
        url: '/tencent_esign/tencent_flowsfile/tencentFlowsFile/queryByFlowId',
        params: {
          flowId: flowId,
        },
      });

      console.log('查询合同文件响应:', response);

      if (response && response.filePath) {
        return response.filePath;
      } else {
        throw new Error('未找到合同文件路径');
      }
    } catch (error) {
      console.error('查询合同文件失败:', error);
      throw error;
    }
  }

  /**
   * 预览合同
   * @param flowId 合同ID
   */
  async function previewContract(flowId: string) {
    try {
      createMessage.loading('正在获取合同文件...', 2);

      const filePath = await queryContractFile(flowId);

      if (filePath) {
        // 直接在新窗口中打开合同文件链接
        window.open(filePath, '_blank');
        createMessage.success('合同文件已在新窗口中打开');
      } else {
        createMessage.error('未找到合同文件');
      }
    } catch (error) {
      console.error('预览合同失败:', error);
      createMessage.error('预览合同失败，请稍后重试');
    }
  }

  // 导出查询合同文件和预览功能，供父组件使用
  defineExpose({
    queryContractFile,
    previewContract,
    flowId,
  });
</script>

<style lang="less" scoped></style>
